#include "mystdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>

#define FILE_MODE 0666

_FILE* _fopen(const char* filename,const char* flag)
{
    assert(filename);
    assert(flag);
    //使用系统调用open创建文件结构体，返回值为文件描述符表的下标
    int fd = -1;
    if(strcmp(flag,"w"))
    {
        fd = open(filename,O_CREAT|O_WRONLY|O_TRUNC,FILE_MODE);
    }else if(strcmp(flag,"a"))
    {

        fd = open(filename,O_CREAT|O_WRONLY|O_APPEND,FILE_MODE);
    }else if(strcmp(flag,"r"))
    {

        fd = open(filename,O_RDONLY);
    }else{
        return NULL;
    }
    
    if(fd == -1) return NULL;

    //创建FILE结构体，该结构体包含描述符下标以及用户级缓冲区
    _FILE* pf = (_FILE*)malloc(sizeof(_FILE));
    if(pf == NULL) return NULL;
    
    pf->fileno = fd;//库函数接收到可以使用的流的下标
    return pf;
}

int _fwrite(_FILE* pf, const char* str, int len)
{

   return  write(pf->fileno,str,len);
   //要注意控制的是符号表下标而不是FILE
}

void _fclose(_FILE* pf)
{
    close(pf->fileno);
    free(pf);
}
